#!/usr/bin/env python
# -*- coding: utf-8 -*-

import re
from typing import List


# 把字符串中多余的空格移除
def remove_extra_spaces(text):
    """
    移除字符串中的多余空格

    Args:
        text (str): 需要处理的文本

    Returns:
        str: 处理后的文本
    """
    if not text:
        return text

    # 先处理行首行尾的空白字符（包括空格、制表符、换行符等）
    text = text.strip()

    # 处理中文之间的空格（中文字符之间不需要空格）
    text = re.sub(r"([\u4e00-\u9fa5])\s+(?=[\u4e00-\u9fa5])", r"\1", text)

    # 处理中文与英文之间的空格（移除中文与英文之间的空格）
    # 中文后跟空格再跟英文的情况
    text = re.sub(r"([\u4e00-\u9fa5])\s+([a-zA-Z\d])", r"\1\2", text)
    # 英文/数字后跟空格再跟中文的情况
    text = re.sub(r"([a-zA-Z\d])\s+([\u4e00-\u9fa5])", r"\1\2", text)

    # 处理英文单词、数字之间的多个空格，只保留一个空格
    # 处理所有非中文字符（英文、数字、标点符号）之间的多个空格
    text = re.sub(r"([^\u4e00-\u9fa5\s])\s{2,}(?=[^\u4e00-\u9fa5\s])", r"\1 ", text)

    # 处理特殊情况：英文字母和数字之间的多个空格
    text = re.sub(r"([a-zA-Z])\s{2,}([a-zA-Z\d])", r"\1 \2", text)
    text = re.sub(r"([\d])\s{2,}([a-zA-Z\d])", r"\1 \2", text)

    # 最后再次处理行首行尾的空格（防止处理过程中产生的新空格）
    text = text.strip()

    return text


def test_remove_extra_spaces():
    """测试remove_extra_spaces函数的各种情况"""
    test_cases = [
        # 中文之间的空格
        "这是 中文 之间 的空格",  # 应该移除空格
        "中文  多个  空格",  # 应该移除多个空格
        # 英文单词之间的空格
        "This  is  multiple  spaces",  # 应该只保留一个空格
        "Single space test",  # 应该保持不变
        "Too    many    spaces",  # 应该改为单个空格
        # 中英文之间的空格
        "中文 English 混合",  # 应该移除中英文之间的空格
        "English 中文 混合",  # 应该移除中英文之间的空格
        "这是   English   文本",  # 应该移除多个空格
        # 标点符号后的空格
        "Hello, world. This is test.",  # 英文标点后应该保持一个空格
        "Hello,  world.  Multiple  spaces.",  # 应该只保留一个空格
        "中文，标点符号。测试。",  # 中文标点后不应该有空格
        # 复杂混合情况
        "   这是  有  空格  的  中文  ",  # 行首行尾和中间空格
        "  English   with   Chinese  中文   混合  ",
        "Smith  (2020)  认为  AI  模型  很重要.",
        # 特殊情况
        "A  B  C  D",  # 英文字母之间
        "一  二  三  四",  # 中文字之间
        "123  456  789",  # 数字之间（可能需要特殊处理）
        # 空字符串和边界情况
        "",  # 空字符串
        "   ",  # 只有空格
        "\n\t 换行和制表符 \n\t",  # 包含其他空白字符
    ]

    print("=== remove_extra_spaces函数测试结果 ===")
    for i, test_text in enumerate(test_cases, 1):
        result = remove_extra_spaces(test_text)
        print(f"测试{i}:")
        print(f"  原文: '{test_text}'")
        print(f"  结果: '{result}'")
        if test_text != result:
            print(f"  ✅ 有变化")
        else:
            print(f"  ➖ 无变化")
        print()


if __name__ == "__main__":
    test_remove_extra_spaces()
